package yl.hs.bmipfull.service.production;

import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.ibatis.annotations.Select;
import yl.hs.bmipfull.pojo.finance.ShipSettleTemp;
import yl.hs.bmipfull.pojo.production.ProductShipOrderEntity;
import yl.hs.bmipfull.service.IBaseService;
import yl.hs.bmipfull.viewmodels.PageQuery;
import yl.hs.bmipfull.viewmodels.PageResult;
import yl.hs.bmipfull.viewmodels.SubmitModel;
import yl.hs.bmipfull.viewmodels.host.ProductionLineDeliverInfoVO;
import yl.hs.bmipfull.viewmodels.production.OrderTransModel;
import yl.hs.bmipfull.viewmodels.salemanmage.ConstructionSignModel;
import yl.hs.bmipfull.viewmodels.salemanmage.SetTimeVO;
import yl.hs.bmipfull.viewmodels.salemanmage.TimeGroupVO;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 作用:  产品发货单服务层接口<br/>
 * 创建时间: 2021年06月21日 10时08分52秒 <br/>
 *
 * @author 谢东
 */

public interface IProductShipOrderService extends IBaseService {

    /**
     * 查询产品发货单信息
     *
     * @param pageQuery 查询条件 {@link PageQuery}
     * @return 产品发货单-List<{@link ProductShipOrderEntity}>
     * @throws Exception 查询参数异常
     */
    List<ProductShipOrderEntity> queryList(PageQuery pageQuery,String productCateSn) throws Exception;

    /**
     * 查询产品发货单信息
     *
     * @param pageQuery 查询条件 {@link PageQuery}
     * @param rowNum    每页条数
     * @param page      页码
     * @return 站内信息-List-SiteMessageMainEntity
     * @throws Exception 查询条件异常
     */
    PageResult<Map<String,Object>> queryPage(PageQuery pageQuery, int rowNum, int page,String productCateSn) throws Exception;


    /**
     * 根据产品发货单编号查询产品发货单信息
     *
     * @param sn 编号
     * @return 产品发货单-{@link ProductShipOrderEntity}
     */
    ProductShipOrderEntity findBySn(String sn);

    /**
     * 保存产品发货单信息
     *
     * @param model 产品发货单表单信息
     * @param sn    产品发货单信息原有编号
     * @return 执行结果-受影响行数-Integer
     * @throws Exception 保存异常
     */
    ProductShipOrderEntity saveProductShipOrder(Map<String, Object> model, String sn) throws Exception;


    /**
     * 根据产品发货单编号删除产品发货单信息
     *
     * @param sn 产品发货单编号
     * @return 影响行数
     */
    Integer delete(String[] sn);

    /**
     * 获取某天生产方量
     *
     * @param date 日期
     * @return 生产方量
     */
    double getDayVolume(Date date, String productCateSN);

    /**
     * 获取某月生产方量
     *
     * @param date 日期
     * @return 生产方量
     */
    double getMonthVolume(Date date, String productCateSN);

    /**
     * 根据任务单号获取生产方量
     *
     * @param snArray 任务单号
     * @return 生产方量
     */
    double getVolumeByTaskSN(List<String> snArray);

    /**
     * 根据单据列表
     *
     * @param state 单据状态
     * @param top   数据条数
     * @param sort  排序字段
     * @return 生产方量
     */
    List<ProductShipOrderEntity> findByState(short state, int top, String sort, Object key,String productCateSN);

    /**
     * 根据单据列表
     *
     * @param truckCode 车辆sn
     * @return 生产方量
     */

    ProductShipOrderEntity findListByTruckCode(String truckCode);

    /**
     * 根据生产任务编号
     *
     * @param pageQuery 任务编号
     * @return 发货单
     */
    List<Map<String, Object>> getListByProductionTaskSN(PageQuery pageQuery);

    /**
     * 根据车辆派车类型以及车辆自编号查询上车发货单信息
     *
     * @param productCateSN 单据种类编号
     * @param truckCode 车辆编号
     * @return 单据信息
     */
    ProductShipOrderEntity findByOrderType(String productCateSN, String truckCode);

    /**
     * 根据车辆派车类型以及生产任务sn查询上车发货单信息
     *
     * @param productCateSN 单据种类编号
     * @param taskSN    生产任务sn
     * @return 单据信息
     */
    ProductShipOrderEntity findByTaskSn(String productCateSN, String taskSN);

    /**
     * 根据车辆派车类型以及生产任务sn查询上车发货单信息
     *
     * @param truckCode 车辆自编号
     * @param state     状态
     * @return 单据信息
     */
    List<ProductShipOrderEntity>  findByTruckCodeState(String truckCode, short state);


    /**
     * 根据生产线获取发货单信息
     * @param lineSn 生产线编号
     * @return 发货单信息
     */
    List<ProductShipOrderEntity> queryByLineSn(String lineSn);


    /**
     * 根据生产线获取 发货信息
     * @param lineSn 生产线编号
     * @return 发货信息
     */
    ProductionLineDeliverInfoVO getDeliverInfoByLineSn(String lineSn);
    /**
     * 根据发货类型时间查询发货单
     * @param productCateSN 单据种类编号，time 时间
     * @return 发货单信息
     */
    List<ProductShipOrderEntity> questListByType(String productCateSN,Date time);

    /**
     * 保存发货单的批量审核信息
     * @param submitModel 审核信息
     * @return
     */
    Integer saveReviewOrders(SubmitModel submitModel);

    /**
     * 保存发货单的签收信息
     * @param submitModel
     * @return
     */
    Integer saveSignInfo(SubmitModel submitModel) throws Exception;

    Integer saveReviewFlag(SubmitModel submitModel) throws Exception;

    /**
     * 作废发货单
     * @param sn 发货单编号
     * @param cause 作废原因
     * @return
     */
    Integer invalidOrder(String sn, String cause);

    /**
     * 根据合同编号获取发货单信息
     * @param contractSn 合同sn
     * @return 发货单信息
     */
    List<ShipSettleTemp> queryByContractSn(String contractSn);

    /**
     *  根据编号修改状态
     * @param snList 编号
     * @param state 状态
     * @return 受影响行数
     */
    Integer changeStateBySN(String[] snList,short state);

    /**
     *  修改发货单开票状态
     * @param snList 编号
     * @param state 状态
     * @return 受影响行数
     */
    Integer changeInvoicingStateBySN(String[] snList,short state);

    /**
     * 获取发货单的发货年份和月份
     * @return 时间
     */
    List<TimeGroupVO> getSetTime();

    /**
     * 判断车辆是否存在暂存信息
     * @param s 车牌号获取蓝牙卡号
     * @return 判断结果
     */
    boolean checkTruckTempOrderExist(String s);

    /**
     * 获取工地合同的发货单
     * @param query 查询条件
     * @param rowNum 页面显示数量
     * @param page 当前页码
     * @return 分页查询结果
     */
    PageResult<ProductShipOrderEntity> queryContractOrders(PageQuery query, int rowNum, int page) throws Exception;

    List<ProductShipOrderEntity> queryContractOrdersList (PageQuery query, int rowNum, int page) throws Exception;
    /**
     * 保存工地用户签收信息
     * @param submitModel 工地用户提交的签收信息
     * @return
     */
    Integer saveConstructionSignInfo(ConstructionSignModel submitModel);

    /**
     * 获取工地客户为签收的发货单数量
     * @param query
     * @return
     */
    Integer queryNotSignedContractOrderCount(PageQuery query);

    ProductShipOrderEntity uploadOrder(SubmitModel submitModel) throws Exception;

    ProductShipOrderEntity querySignedOrder(String sn);

    ProductShipOrderEntity saveOutWeight(SubmitModel submitModel) throws Exception;

    Integer saveFreightReviewOrders(SubmitModel submitModel);

    Integer saveFreightReviewFlag(SubmitModel submitModel);


    Integer updateFiles();

    Integer saveOrderTrans(OrderTransModel transForm) throws JsonProcessingException;

    Integer restore(String sn, String cause);

    /**
     * 发货量统计报表
     * @param type
     * @param companyName
     * @return
     */
    List<String> weightStatistics(Integer type, String companyName, String year, String month);

    /**
     * 车辆工地方量统计报表
     *
     * @param companyName
     * @param startDate
     * @param endDate
     * @return
     */
    Map<String, Object> projectAndCarOrderStatistics(String companyName, Date startDate, Date endDate);

}